package ve.usb.crm;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.cohesion.runtime.Pair;
import ve.usb.crm.hibernate.*;

/**
 * 
 */
public class AccionesAdministrador extends CohesionAction {

    /**
     * Called by Struts for the execution of action APreAdmin.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreAdmin(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VMenuAdmin",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreAdministrar(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VAdministrar",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            Categoria tipoCuenta = (Categoria) s.createQuery("from Categoria where nombre = 'tipoCuenta' and tipo = 0").uniqueResult();
            Categoria sector = (Categoria) s.createQuery("from Categoria where nombre = 'sector' and tipo = 0").uniqueResult();
            Categoria titulo = (Categoria) s.createQuery("from Categoria where nombre = 'titulo' and tipo = 0").uniqueResult();
            Categoria asunto = (Categoria) s.createQuery("from Categoria where nombre = 'asunto' and tipo = 0").uniqueResult();
            Categoria prioridad = (Categoria) s.createQuery("from Categoria where nombre = 'prioridad' and tipo = 0").uniqueResult();
            Categoria estado = (Categoria) s.createQuery("from Categoria where nombre = 'estado' and tipo = 0").uniqueResult();
            Categoria clasificacion = (Categoria) s.createQuery("from Categoria where nombre = 'clasificacion' and tipo = 0").uniqueResult();
            Categoria etapa = (Categoria) s.createQuery("from Categoria where nombre = 'etapa' and tipo = 0").uniqueResult();
            Categoria temas = (Categoria) s.createQuery("from Categoria where nombre = 'temas' and tipo = 0").uniqueResult();

            List<Categoria> L_TipoCuenta = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", tipoCuenta.getIdCategoria()).list();
            List<Categoria> L_Sector = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", sector.getIdCategoria()).list();
            List<Categoria> L_Titulo = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", titulo.getIdCategoria()).list();
            List<Categoria> L_Asunto = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", asunto.getIdCategoria()).list();
            List<Categoria> L_Prioridad = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", prioridad.getIdCategoria()).list();
            List<Categoria> L_Estado = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", estado.getIdCategoria()).list();
            List<Categoria> L_Clasificacion = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", clasificacion.getIdCategoria()).list();
            List<Categoria> L_Etapa = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", etapa.getIdCategoria()).list();
            List<Categoria> L_Temas = (List<Categoria>) s.createQuery("from Categoria where tipo = :idtipo").setLong("idtipo", temas.getIdCategoria()).list();

            request.setAttribute("L_TipoCuenta", L_TipoCuenta);
            request.setAttribute("L_Sector", L_Sector);
            request.setAttribute("L_Titulo", L_Titulo);
            request.setAttribute("L_Asunto", L_Asunto);
            request.setAttribute("L_Prioridad", L_Prioridad);
            request.setAttribute("L_Estado", L_Estado);
            request.setAttribute("L_Clasificacion", L_Clasificacion);
            request.setAttribute("L_Etapa", L_Etapa);
            request.setAttribute("L_Temas", L_Temas);

            request.setAttribute("tipoCuenta", tipoCuenta);
            request.setAttribute("sector", sector);
            request.setAttribute("titulo", titulo);
            request.setAttribute("asunto", asunto);
            request.setAttribute("prioridad", prioridad);
            request.setAttribute("estado", estado);
            request.setAttribute("clasificacion", clasificacion);
            request.setAttribute("etapa", etapa);
            request.setAttribute("temas", temas);





            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward ACrearAdministrar(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreAdministrar", "VCrearAdministrar"};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearCategoria fFCrearCategoria = (FCrearCategoria) form;

            Categoria cate = new Categoria();
            String nom = fFCrearCategoria.getNombre();
            boolean hayError = false;

            if (fFCrearCategoria.getIdCategoria() != 0l) {
                cate = (Categoria) s.load(Categoria.class, fFCrearCategoria.getIdCategoria());
            } 

            if (!nom.equals("")) {
                cate.setNombre(fFCrearCategoria.getNombre());
                Categoria tipo = (Categoria) s.load(Categoria.class, fFCrearCategoria.getTipo());
                cate.setTipo(tipo);
            } else {
                hayError = true;
                request.setAttribute("nombreError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un nombre v&aacute;lido");
            }

            if (hayError) {
                salida = SALIDA_1;
            } else {
                if (fFCrearCategoria.getIdCategoria() == 0l) {
                    s.save(cate);
                } else {
                    cate.setIdCategoria(fFCrearCategoria.getIdCategoria());
                    s.update(cate);
                }

                s.flush();
            }

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward AEliminarAdministrar(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreAdministrar",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearCategoria ffCrearCategoria = FCrearCategoria.clear(mapping, request);

            Long idCategoria = lookup_Long(request, "idCategoria");

            Categoria categoria = (Categoria) s.load(Categoria.class, idCategoria);

            try {
                s.delete(categoria);
            } catch (Exception e) {
                request.setAttribute("errorBorrar", "No se puede borrar, ahi elementos relacionados a el.");
            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreEditarAdministrar(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearAdministrar",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearCategoria ffCrearCategoria = FCrearCategoria.clear(mapping, request);

            Long idCategoria = lookup_Long(request, "idCategoria");

            Categoria categoria = (Categoria) s.load(Categoria.class, idCategoria);

            ffCrearCategoria.setIdCategoria(categoria.getIdCategoria());
            ffCrearCategoria.setNombre(categoria.getNombre());
            ffCrearCategoria.setTipo(categoria.getTipo().getIdCategoria());

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreCrearAdministrar(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearAdministrar",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearCategoria ffCrearCategoria = FCrearCategoria.clear(mapping, request);

            Long idCategoria = lookup_Long(request, "idCategoria");

            ffCrearCategoria.setTipo(idCategoria);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward ATheme(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreHome",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCambiarTheme ffCambiarTheme = (FCambiarTheme) form;

            Categoria theme = (Categoria) s.load(Categoria.class, ffCambiarTheme.getTheme());

            Usuario usuario = (Usuario) request.getSession().getAttribute("Login");

            usuario.setTheme(theme);
            s.update(usuario);
            s.flush();

            request.getSession().removeAttribute("theme");
            request.getSession().setAttribute("theme", theme.getNombre());



            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreTheme(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VMenuTheme",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCambiarTheme ffCambiarTheme = FCambiarTheme.clear(mapping, request);
            cargarCollection(ffCambiarTheme, s);



            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public void cargarCollection(FCambiarTheme ffCambiarTheme, Session s) {

        Long themeCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'temas' and tipo = 0").uniqueResult();
        List<Pair> listTheme = new ArrayList<Pair>();
        listTheme =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                + "from Categoria where tipo= :idCategoria").setLong("idCategoria", themeCategoria).list();
        ffCambiarTheme.setListTheme(listTheme);

//        if (CohesionActor.checkActor(request, CohesionActor.ACTOR_administrador)) {
//            listRol =
//                    (List<Pair>) s.createQuery(
//                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
//                    + "from Categoria where tipo= :idCategoria").setLong("idCategoria", rolCategoria).list();
//
//        } else if (CohesionActor.checkActor(request, CohesionActor.ACTOR_empleado)) {
//            listRol =
//                    (List<Pair>) s.createQuery(
//                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
//                    + "from Categoria where tipo= :idCategoria and nombre != :administrador").setLong("idCategoria", rolCategoria).setString("administrador", "administrador").list();
//
//        } else {
//            listRol.add(new Pair("Ninguna", 0));
//        }
//        fFCrearUsuario.setListRolCategoria(listRol);
    }
}
